package top.shiyiri.collections;

import org.junit.Test;

import java.util.*;

/**
 * @author Aunean
 * @date 2022/1/6
 */
/*
Collections：操作Collection、Map的工具类

面试题：Collection 和 Collections的区别？
Collection是一个接口
Collections是一个操作Collection、Map的工具类
 */
public class CollectionsTest {

    ArrayList<Integer> list = new ArrayList<>();

    {
        list.add(123);
        list.add(456);
        list.add(456);
        list.add(-23);
        list.add(78);
        list.add(78);
        list.add(78);
        list.add(93);
    }

    /*
    reverse(List)：反转 List 中元素的顺序
    shuffle(List)：对 List 集合元素进行随机排序
    sort(List)：根据元素的自然顺序对指定 List 集合元素按升序排序
    sort(List，Comparator)：根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
    swap(List，int， int)：将指定 list 集合中的 i 处元素和 j 处元素进行交换
    Object max(Collection)：根据元素的自然顺序，返回给定集合中的最大元素
    Object max(Collection，Comparator)：根据 Comparator 指定的顺序，返回
        给定集合中的最大元素
    Object min(Collection)
    Object min(Collection，Comparator)
    int frequency(Collection，Object)：返回指定集合中指定元素的出现次数
    void copy(List dest,List src)：将src中的内容复制到dest中
    boolean replaceAll(List list，Object oldVal，Object newVal)：使用新值替换 List 对象的所有旧值
     */

    @Test
    public void test1() {
        System.out.println(list);

        //reverse(List)：反转 List 中元素的顺序
        Collections.reverse(list);
        System.out.println(list);

        //shuffle(List)：对 List 集合元素进行随机排序
        Collections.shuffle(list);
        System.out.println(list);

        //sort(List)：根据元素的自然顺序对指定 List 集合元素按升序排序
        Collections.sort(list);
        System.out.println(list);

        //swap(List，int， int)：将指定 list 集合中的 i 处元素和 j 处元素进行交换
        Collections.swap(list, 0, 1);
        System.out.println(list);

        //int frequency(Collection，Object)：返回指定集合中指定元素的出现次数
        int frequency = Collections.frequency(list, 78);
        System.out.println(frequency);
    }

    @Test
    public void test2() {

        //void copy(List dest,List src)：将src中的内容复制到dest中
        List<Object> list1 = Arrays.asList(new Object[list.size()]);
        Collections.copy(list1, list);
        System.out.println(list1);

        //boolean replaceAll(List list，Object oldVal，Object newVal)：使用新值替换 List 对象的所有旧值
        Collections.replaceAll(list1, 78, 18);
        System.out.println(list1);
    }

    /*
    Collections 类中提供了多个 synchronizedXxx() 方法，该方法可使将指定集
    合包装成线程同步的集合，从而可以解决多线程并发访问集合时的线程安全
    问题
     */
    @Test
    public void test3() {
        Collections.synchronizedList(list);
        System.out.println(list);
    }
}
